/**
 * Created by Happy on 2016/6/3 0003.
 */
(function () {
    //额外的函数支持
    function isType(type) {
        return function(obj) {
            return {}.toString.call(obj) == "[object " + type + "]"
        }
    }
    var Util={
        isObject :isType("Object"),
        isString :isType("String"),
        isArray : Array.isArray || isType("Array"),
        isFunction : isType("Function"),
        isUndefined : isType("Undefined"),
        simpleT: function (str, obj) { //简单的变量提花模板
            var match = str.match(/{.+?}/g);
            var newObj = {};
            for (var i in obj) {
                newObj['{' + i + '}'] = obj[i];
            }
            return str.replace(/{.+?}/g, function (o) {
                return newObj[o] ? newObj[o] : '';
            });
        },
        getRandom: function () {
            return Math.floor(Math.random() * 100);
        },
        //复制javascript对象
        copy_obj_arr:function(obj_arr){
            var new_obj_arr=[],item;
            for(var i=0;i<obj_arr.length;i++){
                item=obj_arr[i];
                new_obj_arr.push({});
                for(var j in item){
                    new_obj_arr[i][j]=item[j];
                }
            }
            return new_obj_arr;
        }
    };

    //常用表单组件的模板
    var FormCom = function () {
        this.config={
            style:'bootstrap2',
            data_source:[] //未经处理的原始数据源
        }
    };
     //设置参数 set_config({style:'bootstrap3'})
    FormCom.prototype.set_config=function(config){
           for(var i in config){
               this.config[i]=config[i];
           }
    };

    FormCom.prototype.get_config=function(key){
        return this.config[key];
    };

    //加载数据
    FormCom.prototype.loadData=function(data){ //加载数据

        var i,item,element,p=this,f=[];
        p.config.data_source=Util.copy_obj_arr(data);
        var start='<form class="form-horizontal">';

        f.push(start);
        var outer_form=true,outer=[]; //表外元素

        for(i=0;i<data.length;i++){
            item=data[i];

            if(!item.element){
                item.element='input'; //设置默认值
            }
            element= item.element;
            delete item.element;

            //console.log(element);
            if(element=='form'){
                f[0]= p[element](item);
                outer_form=false;//进入表内元素
            }
            if(outer_form){  //表外元素单独处理
                outer.push(p[element](item));
            }
            else{

                f.push(p[element](item));
            }

        }
        f.push('</form>');
        return outer.join('')+f.join(''); //表外元素加form表单
    };

    FormCom.prototype.build_wrapper = function (option) {
        //bootstrap 2的样式
        var p=this;
        var outer = [];
        if(p.config.style=='bootstrap2'){
            outer.push('<div class="control-group">');
            outer.push(' <label class="control-label" for="{id}">{label}</label>');
            outer.push(' <div class="controls">');
            outer.push('  {control}');
            outer.push('  </div>');
            outer.push('  </div>');
        }
        else if(p.config.style=='bootstrap3'){
            outer.push('<div class="form-group">');
            outer.push(' <label for="inputPassword3" class="col-sm-2 control-label" for="{id}">{label}</label>');
            outer.push(' <div class="col-sm-6">');
            outer.push('  {control}');
            outer.push('  </div>');
            outer.push('  </div>');
        }
        else{ //默认按照bootstrap2的规则
            outer.push('<div class="control-group">');
            outer.push(' <label class="control-label" for="{id}">{label}</label>');
            outer.push(' <div class="controls">');
            outer.push('  {control}');
            outer.push('  </div>');
            outer.push('  </div>');
        }
        return Util.simpleT(outer.join(''), option);
    };
    //合并选项类
    var mergeOption = function (option1, option2) {
        var i;
        for (i in option1) {
            if (typeof option2[i] == 'undefined') {
                option2[i] = option1[i];
            }
        }
        return option2;
    };
    //生成input
    FormCom.prototype.input = function (option) {
        var style=this.config.style;
        var IsBootstrap3=(style=='bootstrap3');

        var tpl = [], i;
        var rand = Util.getRandom();
        //默认与合并
        var default_option = {
            'label': '',
           // 'name': 'input' + rand,
            'type': 'text',  //还有可能是password  hidden  button  submit reset
            'id': 'input' + rand
        };

        option = mergeOption(default_option, option);
       var label=option.label;
        delete  option.label;

        if(option.type.match(/button|submit|reset/)&&!option['class']){ //如果是按钮并且没有设置按钮类
            option['class']='btn btn-default';
        }

        if(IsBootstrap3&&!option.type.match(/file|button|submit|reset/)){//在控件添加form-control样式,上传控件不需要这个样式
        if(option['class']){option['class']=option['class']+' form-control' }else{option['class']='form-control';  }
        }

        tpl.push('<input ');
        for (i in option) {
            tpl.push('  '+i + '="' +option[i] + '"');
        }
        tpl.push('>');
        var obj = {
            control: tpl.join(''),
            label: label
        };
        if(option.type=='hidden'){  //hidden不需要占位符control wrapper
            return obj.control;
        }
        return this.build_wrapper(obj);
    };
    //生成select
    FormCom.prototype.select = function (option) {
        var style=this.config.style;
        var IsBootstrap3=(style=='bootstrap3');
        var tpl = [],inner=[], i,values,label,rand = Util.getRandom();
        //默认与合并
        var default_option = {
            'label': '名称',
         //   'name': 'input' + rand,
            'id': 'input' + rand,
            'value':['选项1','选项2']
        };
        option = mergeOption(default_option, option);

        //
        label=option.label;
        values=option.value;
        delete  option.value;
        delete  option.label;
        tpl.push('<select ');
        if(IsBootstrap3){//在控件添加form-control样式,上传控件不需要这个样式
            if(option['class']){option['class']=option['class']+' form-control' }else{option['class']='form-control';  }
        }
        for (i in option) {
            tpl.push(i + '="' +option[i] + '"');
        }
        tpl.push('>');
        if(Util.isObject(values)){ //包含key
            for( i in values){
                inner.push('<option value="'+i+'">'+values[i]+'</option>');
            }
        }
        else{ //只有value
            for(i=0;i<values.length;i++){
                inner.push('<option value="'+i+'">'+values[i]+'</option>');
            }
        }
        tpl.push(inner.join(''));
        tpl.push('</select>');
        var obj = {
            control: tpl.join(''),
            label: label
        };
        return this.build_wrapper(obj);
    };
    //文本框
    FormCom.prototype.textarea=function(option){
        var style=this.config.style;
        var IsBootstrap3=(style=='bootstrap3');
        var tpl = [],i,values,label,rand = Util.getRandom();
        //默认与合并
        var default_option = {
            'label': '名称',
          //  'name': 'input' + rand,
            'id': 'input' + rand,
            value:''
        };
        option = mergeOption(default_option, option);


        label=option.label;
        delete  option.label;
        values=option.value;
        delete  option.value;
        tpl.push('<textarea ');
        if(IsBootstrap3){//在控件添加form-control样式,上传控件不需要这个样式
            if(option['class']){option['class']=option['class']+' form-control' }else{option['class']='form-control';  }
        }
        for (i in option) {
            tpl.push(i + '="' +option[i] + '"');
        }
        tpl.push('>');
        tpl.push(values);
        tpl.push('</textarea>');
        var obj = {
            control: tpl.join(''),
            label: label
        };
        return this.build_wrapper(obj);
    };
    //复选框
    FormCom.prototype.checkbox = function (option) {
        var style=this.config.style;
        var IsBootstrap3=(style=='bootstrap3');
        var tpl = [],inner=[], i,values,label,rand = Util.getRandom();
        //默认与合并
        var default_option = {
            label:'名称',
            value:['选项1','选项2']
        };
        option = mergeOption(default_option, option);

        //
        label=option.label;
        values=option.value;
        delete  option.value;
        delete  option.label;
        tpl.push('<div');
        for (i in option) {
            tpl.push(' '+i + '="' +option[i] + '"');
        }
        tpl.push('>');
        if(Util.isObject(values)){ //包含key
            for( i in values){
                if(IsBootstrap3){
                    inner.push('<label class="checkbox-inline" >');
                }
                else{
                    inner.push('<label class="checkbox inline checkbox-inline" >');
                }

                inner.push('<input type="checkbox" value="'+i+'">');
                inner.push(values[i]);
                inner.push('</label>');
            }
        }
        else{ //数组的形式
            for(i=0;i<values.length;i++){
                 if(IsBootstrap3){
                     inner.push('<label class="checkbox-inline" >');
                 }
                else{
                     inner.push('<label class="checkbox inline" >');
                 }


                inner.push('<input type="checkbox" value="'+i+'">');
                inner.push(values[i]);
                inner.push('</label>');
            }
        }
        tpl.push(inner.join(''));
        tpl.push('</div>');
        var obj = {
            control: tpl.join(''),
            label: label
        };
        return this.build_wrapper(obj);
    };

    FormCom.prototype.radio = function (option) {
        var style=this.config.style;
        var IsBootstrap3=(style=='bootstrap3');
        var tpl = [],inner=[],name, i,values,label,rand = Util.getRandom();
        //默认与合并
        var default_option = {
            label:'名称',
            value:['选项1','选项2'],
          //  name:'radio'+rand,
            id:'checkbox'+rand  //将会设置外层div id 用于筛选
        };
        option = mergeOption(default_option, option);

        //
        name=option.name;
        label=option.label;
        values=option.value;
        delete  option.value;
        delete  option.label;
        tpl.push('<div');
        for (i in option) {
            tpl.push(' '+i + '="' +option[i] + '"');
        }
        tpl.push('>');
        if(Util.isObject(values)){ //包含key
            for( i in values){
                if(IsBootstrap3){
                    inner.push('<label class="radio-inline" >');
                }
                else{
                    inner.push('<label class="radio inline" >');
                }
                inner.push('<input type="radio" name="'+name+'" value="'+i+'">');
                inner.push(values[i]);
                inner.push('</label>');
            }
        }
        else{ //数组的形式
            for(i=0;i<values.length;i++){
                if(IsBootstrap3){
                    inner.push('<label class="radio-inline" >');
                }
                else{
                    inner.push('<label class="radio inline" >');
                }
                inner.push('<input type="radio" name="'+name+'"  value="'+i+'">');
                inner.push(values[i]);
                inner.push('</label>');
            }
        }
        tpl.push(inner.join(''));
        tpl.push('</div>');
        var obj = {
            control: tpl.join(''),
            label: label
        };
        return this.build_wrapper(obj);
    };

    FormCom.prototype.form = function (option) {
        var i,inner=[];
        inner.push('<form class="form-horizontal" ');
        for (i in option) {
            inner.push(i + '="' +option[i] + '"');
        }
        inner.push('>');
        return inner.join('');
    };
    //新增html和image扩展2016-6-21 lcc
    FormCom.prototype.img=function(option){

        var i,inner=[];
       var label=option.label;
        delete  option.label;
        if(!option.src&&option.value){
            option.src=option.value;
            delete  op
        }
        inner.push('<img ');
        for (i in option) {
            inner.push(i + '="' +option[i] + '"');
        }
        inner.push('/>');
        var obj = {
            control: inner.join(''),
            label: label
        };
        return this.build_wrapper(obj);
    };
     //html扩展 外围会有control元素包裹
    FormCom.prototype.form_html=function(option){

        var label=option.label;
        delete  option.label;
        var obj = {
            control: option['html'],
            label: label
        };
        return this.build_wrapper(obj);
    };
    //script标签，目前只支持jquery document.ready执行模式
    FormCom.prototype.script=function(option){
       var code=option['html'],script_wrapper=['<script type="text/javascript">'];
        script_wrapper.push(code);
        script_wrapper.push('</script>');
        $(function(){
            eval(code);//加载后执行
        });
       return script_wrapper.join('');
    };
    //纯html，不加任何处理
    FormCom.prototype.html=function(option){
        return option['html'];
    };

    //隐藏元素的特殊处理
    FormCom.prototype.set_hidden=function(){  //hidden绑定的设置元素如select radio等
        var item, Form_Obj=this.config.data_source,name,com,value,set_name;
        for(var i=0;i<Form_Obj.length;i++) {
            item = Form_Obj[i];
            if(item.type=='hidden'){
                value=item.value;
                name=item.name;
                set_name='set_'+name;
                com=this.find_name_exist(set_name);
                if(com){//如果设置的id存在
                    //查看设置的类型，只有图片需要绑定事件，其余在后台处理set_变量即可
                    if(com.element=='select'){ //select框
                        $("select[name="+set_name+"]").val(item.value);
                        //绑定更改触发事件
                    }
                    else if(com.element=='radio'){ //单选框

                        var set="input[type=radio][name="+set_name+"][value="+value+"]";
                        $(set).attr("checked",true);

                    }
                    else if(com.element=='checkbox'){ //复选框
                        $("input[type=checkbox][name="+set_name+"][value="+value+"]").attr("checked",true);
                    }

                    else if(com.element=='img'){ //图片，设置图片链接
                        var img=$("img[name="+set_name+"]");
                        var file=$("input[type=file][name="+set_name+"]");
                        file.attr('name','');
                        file.attr('data-name',set_name);
                        file.parent().append('<input type="hidden" name="'+set_name+'" />');
                        img.attr('src',value);
                        if(file.size()>0){ //说明有上传图片的功能
                            //绑定事件
                            file.on('change',function(){
                                var f = this.files[0]; //this就是file的dom
                                //判断类型是不是图片
                                if(!/image\/\w+/.test(f.type)){
                                    alert("请确保文件为图像类型");
                                    return false;
                                }
                                if(Math.floor(f.size/1024/1024)>10){
                                    alert('图片大小超过1MB，请上传10MB以内的图片');
                                    return false;
                                }

                                var set_name=$(this).attr('data-name');
                                var reader = new FileReader();
                                reader.readAsDataURL(f);
                                reader.onload = function(e){

                                    $("img[name="+set_name+"]").attr('src',this.result);
                                    $("input[name="+set_name+"]").val(this.result);
                                }
                            });
                        }
                    }
                }
            }
        }

    };
     //查找指定name是否存在，存在则返回该对象
    FormCom.prototype.find_name_exist=function(set_name){
        var Form_Obj=this.config.data_source,item;
        for(var i=0;i<Form_Obj.length;i++) {
            item = Form_Obj[i];
            if(item.name==set_name){
                return item;
            }
        }
        return false;
    };
    //阻止表单重复提交
    FormCom.prototype.prevent_repeat_submit=function(){
        $('body').on('submit','form',function(){
            $(this).find('input[type=submit]').attr('disabled',true);
        });
    };
    this.FormCom=FormCom;
})();